home *** CD-ROM | disk | FTP | other *** search
/ SGI Freeware 1999 August / SGI Freeware 1999 August.iso / dist / fw_gimp.idb / usr / freeware / share / gimp / scripts / blend-anim.scm.z / blend-anim.scm
Encoding:
GIMP Script-Fu Script  |  1999-07-21  |  8.2 KB  |  253 lines

  1. ; The GIMP -- an image manipulation program
  2. ; Copyright (C) 1995 Spencer Kimball and Peter Mattis
  3. ; This program is free software; you can redistribute it and/or modify
  4. ; it under the terms of the GNU General Public License as published by
  5. ; the Free Software Foundation; either version 2 of the License, or
  6. ; (at your option) any later version.  
  7. ; This program is distributed in the hope that it will be useful,
  8. ; but WITHOUT ANY WARRANTY; without even the implied warranty of
  9. ; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  10. ; GNU General Public License for more details.
  11. ; You should have received a copy of the GNU General Public License
  12. ; along with this program; if not, write to the Free Software
  13. ; Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  14. ;
  15. ;
  16. ; blend-anim.scm   version 1.02   05/28/98
  17. ;
  18. ; CHANGE-LOG:
  19. ; 1.00 - initial release
  20. ; 1.01 - some code cleanup, no real changes
  21. ; 1.02 - use gimp-message to output an error message if called
  22. ;        with less than three layers
  23. ;
  24. ; Copyright (C) 1997-98 Sven Neumann (neumanns@uni-duesseldorf.de)
  25. ;  
  26. ; Blends two or more layers over a backgound, so that an animation can
  27. ; be saved. A minimum of three layers is required.
  28.  
  29. (define (multi-raise-layer image layer times)
  30.   (while (> times 0)
  31.      (gimp-image-raise-layer image layer)
  32.      (set! times (- times 1))))
  33.        
  34.   
  35. (define (script-fu-blend-anim img
  36.                   drawable
  37.                   frames
  38.                   max-blur
  39.                   looped)
  40.   (let* ((max-blur (max max-blur 0))
  41.      (frames (max frames 0))
  42.      (image (car (gimp-channel-ops-duplicate img)))
  43.      (width (car (gimp-image-width image)))
  44.      (height (car (gimp-image-height image)))
  45.      (layers (gimp-image-get-layers image))
  46.      (num-layers (car layers))
  47.      (layer-array (cadr layers))
  48.      (slots (- num-layers 2))
  49.      (bg-layer (aref layer-array (- num-layers 1)))
  50.      (max-width 0)
  51.      (max-height 0)
  52.      (offset-x 0)
  53.      (offset-y 0))
  54.     
  55.   (if (> num-layers 2)
  56.       (begin
  57.  
  58.     (gimp-image-disable-undo image)
  59.  
  60.     (if (= looped TRUE)
  61.         ; add a copy of the lowest blend layer on top 
  62.         (let* ((copy (car (gimp-layer-copy 
  63.                    (aref layer-array (- num-layers 2)) TRUE))))
  64.           (gimp-image-add-layer image copy 0)
  65.           (set! layers (gimp-image-get-layers image))
  66.           (set! num-layers (car layers))
  67.           (set! layer-array (cadr layers))
  68.           (set! slots (- num-layers 2))
  69.           (set! bg-layer (aref layer-array (- num-layers 1)))))
  70.  
  71.     ; make all layers invisible and check for sizes
  72.     (let* ((min-offset-x width)
  73.            (min-offset-y height)
  74.            (layer-count slots)) 
  75.       (gimp-layer-set-visible bg-layer FALSE)
  76.       (while (> layer-count -1)
  77.              (let* ((layer (aref layer-array layer-count))
  78.             (layer-width (+ (car (gimp-drawable-width layer))
  79.                     (* max-blur 2)))
  80.             (layer-height (+ (car (gimp-drawable-height layer))
  81.                      (* max-blur 2)))
  82.             (layer-offsets (gimp-drawable-offsets layer))
  83.             (layer-offset-x (- (car layer-offsets) max-blur))
  84.             (layer-offset-y (- (cadr layer-offsets) max-blur)))
  85.            (gimp-layer-set-visible layer FALSE)
  86.            (set! max-width (max max-width layer-width))
  87.            (set! max-height (max max-height layer-height))
  88.            (set! min-offset-x (min min-offset-x layer-offset-x))
  89.            (set! min-offset-y (min min-offset-y layer-offset-y))               
  90.            (set! layer-count (- layer-count 1))))
  91.       (set! offset-x (- (car (gimp-drawable-offsets bg-layer)) 
  92.                 min-offset-x))
  93.       (set! offset-y (- (cadr (gimp-drawable-offsets bg-layer)) 
  94.                 min-offset-y)))
  95.     
  96.     ; create intermediate frames by merging copies of adjascent layers 
  97.     ; with the background layer 
  98.     (let* ((layer-count slots))
  99.       (while (> layer-count 0)
  100.          (let* ((frame-count frames)
  101.             (lower-layer (aref layer-array layer-count))
  102.             (upper-layer (aref layer-array (- layer-count 1))))
  103.            (while (> frame-count 0)
  104.               (let* ((opacity (* (/ frame-count (+ frames 1)) 100))
  105.              (blur (/ (* opacity max-blur) 100))
  106.              (upper-copy (car (gimp-layer-copy upper-layer TRUE)))
  107.              (lower-copy (car (gimp-layer-copy lower-layer TRUE)))
  108.              (bg-copy (car (gimp-layer-copy bg-layer TRUE))))
  109.             (gimp-image-add-layer image bg-copy 0)
  110.             (gimp-image-add-layer image lower-copy 0)
  111.             (gimp-image-add-layer image upper-copy 0)
  112.             (gimp-layer-set-visible upper-copy TRUE)
  113.             (gimp-layer-set-visible lower-copy TRUE)
  114.             (gimp-layer-set-visible bg-copy TRUE)
  115.             (gimp-layer-set-opacity upper-copy (- 100 opacity))
  116.             (gimp-layer-set-opacity lower-copy opacity)
  117.             (gimp-layer-set-opacity bg-copy 100)
  118.             (if (> max-blur 0)
  119.             (let* ((layer-width (car (gimp-drawable-width upper-copy)))
  120.                    (layer-height (car (gimp-drawable-height upper-copy))))
  121.               (gimp-layer-set-preserve-trans upper-copy FALSE)
  122.               (gimp-layer-resize upper-copy
  123.                          (+ layer-width (* blur 2))
  124.                          (+ layer-height (* blur 2))
  125.                          blur
  126.                          blur)
  127.               (plug-in-gauss-rle 1 
  128.                          image 
  129.                          upper-copy 
  130.                          blur 
  131.                          TRUE TRUE)
  132.               (set! blur (- max-blur blur))
  133.               (gimp-layer-set-preserve-trans lower-copy FALSE)
  134.               (set! layer-width (car (gimp-drawable-width 
  135.                           lower-copy)))
  136.               (set! layer-height (car (gimp-drawable-height 
  137.                            lower-copy)))
  138.               (gimp-layer-resize lower-copy
  139.                          (+ layer-width (* blur 2))
  140.                          (+ layer-height (* blur 2))
  141.                          blur
  142.                          blur)
  143.               (plug-in-gauss-rle 1 
  144.                          image 
  145.                          lower-copy 
  146.                          blur 
  147.                          TRUE TRUE)))
  148.             (gimp-layer-resize bg-copy 
  149.                        max-width
  150.                        max-height
  151.                        offset-x
  152.                        offset-y)
  153.             (let* ((merged-layer (car (gimp-image-merge-visible-layers 
  154.                          image CLIP-TO-IMAGE))))
  155.               (gimp-layer-set-visible merged-layer FALSE))
  156.             (set! frame-count (- frame-count 1))))
  157.            (set! layer-count (- layer-count 1)))))
  158.     
  159.     ; merge all original blend layers but the lowest one 
  160.         ; with copies of the background layer 
  161.     (let* ((layer-count 0))
  162.       (while (< layer-count slots)
  163.              (let* ((orig-layer (aref layer-array layer-count))    
  164.             (bg-copy (car (gimp-layer-copy bg-layer TRUE))))
  165.            (gimp-image-add-layer image 
  166.                      bg-copy 
  167.                      (* layer-count (+ frames 1)))
  168.            (multi-raise-layer image 
  169.                   orig-layer 
  170.                   (+ (* (- slots layer-count) frames) 1))
  171.            (gimp-layer-set-visible orig-layer TRUE)
  172.            (gimp-layer-set-visible bg-copy TRUE)
  173.            (gimp-layer-resize bg-copy 
  174.                   max-width
  175.                   max-height
  176.                   offset-x
  177.                   offset-y)
  178.            (let* ((merged-layer (car (gimp-image-merge-visible-layers 
  179.                     image CLIP-TO-IMAGE))))
  180.          (gimp-layer-set-visible merged-layer FALSE))
  181.            (set! layer-count (+ layer-count 1)))))
  182.     
  183.     ; merge the lowest blend layer with the background layer  
  184.     (let* ((orig-layer (aref layer-array (- num-layers 2))))
  185.       (gimp-layer-set-visible bg-layer TRUE)
  186.       (gimp-layer-set-visible orig-layer TRUE)
  187.       (gimp-image-merge-visible-layers image CLIP-TO-IMAGE))
  188.     
  189.     ; make all layers visible again
  190.     (let* ((result-layers (gimp-image-get-layers image))
  191.            (num-result-layers (car result-layers))
  192.            (result-layer-array (cadr result-layers))
  193.            (layer-count (- num-result-layers 1)))
  194.       (while (> layer-count -1)
  195.          (let* ((layer (aref result-layer-array layer-count))
  196.             (name (string-append "Frame " 
  197.                      (number->string 
  198.                       (- num-result-layers layer-count) 10))))
  199.            (gimp-layer-set-visible layer TRUE)
  200.            (gimp-layer-set-name layer name)
  201.            (set! layer-count (- layer-count 1))))
  202.     
  203.       (if (= looped TRUE)
  204.           ; remove the topmost layer
  205.           (gimp-image-remove-layer image (aref result-layer-array 0))))
  206.           
  207.     (gimp-image-enable-undo image)
  208.     (gimp-display-new image)
  209.     (gimp-displays-flush))
  210.   (gimp-message "Blend Animation needs at least three source layers"))))
  211.  
  212. (script-fu-register "script-fu-blend-anim" 
  213.             "<Image>/Script-Fu/Animators/Blend"
  214.             "Blend two or more layers over a background, so that an 
  215.                      animation can be saved"
  216.             "Sven Neumann (neumanns@uni-duesseldorf.de)"
  217.             "Sven Neumann"
  218.             "05/28/1998"
  219.             "RGB RGBA GRAY GRAYA"
  220.             SF-IMAGE "Image" 0
  221.             SF-DRAWABLE "Drawable" 0
  222.             SF-VALUE "Intermediate Frames" "3"
  223.             SF-VALUE "Max. Blur Radius" "0"
  224.             SF-TOGGLE "Looped" TRUE)
  225.  
  226.  
  227.  
  228.  
  229.  
  230.  
  231.  
  232.  
  233.  
  234.  
  235.  
  236.  
  237.  
  238.  
  239.  
  240.  
  241.  
  242.  
  243.  
  244.  
  245.  
  246.  
  247.  
  248.  
  249.